<?php
/**
 * param:
 * is_prop      tinyint  是否是物业费（0：否，1：是）
 * type         tinyint  缴费类别（0：普通分类，1：位置类，2：阶梯类）
 * com_id       int      物业id
 * cmt_id       int      小区id
 * name_prop    varchar  缴费类型名称（物业专用）例：工业水费
 * name_user    varchar  缴费类型名称（用户专用）例：水费
 * unit_name    tinyint  计量单位名称（0：度，1：平方米，2：立方米）
 * price_type   tinyint  价格计算类型（0：固定，1：用量，2：用量阶梯，3：楼层阶梯,4:单价×房屋面积）
 * price_set    varchar  价格设置 
 *                       当price_type的值为：固定、用量时，price_set类型为固定的数字字符串
 *                       当price_type的值为：用量阶梯、楼层阶梯时，price_set未JSON字符串
 *                       用量阶梯：[{value:50,price:6.2},{value:100,price:7.6}]
 *                       楼层阶梯：[{value:1,price:5},{value:2,price:6}]
 * late_enabled tinyint  是否开启滞纳金（0：否，1：是）
 * late_unit    tinyint  滞纳金时间单位（0：月，1：季度，2：年）
 * late_type    tinyint  滞纳金计算方式（0：固定值，1：百分比） 
 * late_value   float    滞纳金度量值
 * 
 */

class Fee {
    
    /**
     * $obj = [
     *     "assets" => '',   //资产类型
     *     "assets_id" => '', //资产id
     *     "metric_now" => '',   //现在的抄表数
     *     "metric_before" => ''  //以前的抄表数
     * ]
     */
    public static function amount($set_id,array $obj){

        $sql = 'select * from fee_set where id = ?';
        $arg = [$set_id];
        $info = Mdb::query(MDB_MAIN,$sql,$arg);

        
        //固定值
        if($info[0]['price_type'] == 0){
            return ["amount" => floatval($info[0]['price_set']), "unit" => $info[0]['unit_name']]; 
        }
        
        $assets = self::assetsInfo($obj['assets'],$obj['assets_id']);
        
        //根据用量计算
        if($info[0]['price_type'] == 1){
            return self::value($info,$assets);
        }
        //根据用量阶梯计算
        if($info[0]['price_type'] == 2){
            return self::ladderValue($info,$assets);
        }   
        //楼层阶梯计算
        if($info[0]['price_type'] == 3){
            return self::ladderFloor($info,$assets);
        }
    }

    public static function assetsInfo($assets,$assets_id) {

      $sql = 'select * from prop_' . $assets . ' where id = ?';
      $arg = [$assets_id];
      $info = Mdb::query(MDB_MAIN,$sql,$arg);
      return $info[0];
    }

    //根据用量计算
    public static function value($info,$assets) {
        if($info[0]['unit_name'] == 1){
            $amount = $info[0]['price_set'] * $assets['size'];
            return ['amount' => $amount,'unit' => $info[0]['unit_name']];
        }
        if($info[0]['unit_name'] == 0 || $info[0]['unit_name'] == 2){
            $metric = $obj['metric_now'] - $obj['metric_before'];
            $amount = $info[0]['pirce_set'] * $metric;
            return ['amount' => $amount,"unit" => $info[0]['unit_name']];
        }
    }

    //更具用量阶梯计算
    public static function ladderValue($info,$assets) {
        $metric = $obj['metric_now'] - $obj['metric_before'];
        $list = json_decode($info[0]['price_set'],true);
        $price = 0;
        foreach($list as $val){
            if($metric >= $val['value']) $price = $val['price'];
        }
        return ['amount' => $price * $metric,"unit" => $info[0]['unit_name']];
    }

    //楼层阶梯计算
    public static function ladderFloor($assets) {
        $floor = $assets['floor'];
        $list = json_decode($info[0]['price_set'],true);
        $price = 0;
        foreach($list as $val){
            if($floor == $val['value']) $price = $val['price']; 
        }
        return ['amount' => $price,"unit" => $info[0]['unit_name']];
    }
}